#include "font.h"

FontManager::FontManager(void)
{
	/* imposta i parametri dei font */
	
	consoleFont.pixelWidth = 22;
	consoleFont.pixelHeight = 43;
	consoleFont.texture = TEXTURE_CONSOLE_FONT;
	consoleFont.textureSize = 512;
	consoleFont.height = 0.70f;
	consoleFont.width = 0.36f;
	
	//consoleFont.
}

FontManager::~FontManager(void)
{
		
}

void FontManager::generateLists(void)
{	
	/* crea 164 display list per le lettere del font console */
	consoleFont.font[0] = glGenLists(164);
	
	GLfloat consoleRasterWidth = 0.22f*2.0f;
	GLfloat consoleRasterHeight = 0.43f*2.0f;
	
	/* le inizializza */
	for (int i = 0; i < 164; ++i)
	{	
		if (i != 0)
			consoleFont.font[i] = consoleFont.font[i-1] + 1;
		
		/* mappatura texture del carattere */
		GLfloat curY = ((i%15)*consoleFont.pixelWidth) / ((float)512);
		GLfloat curX = ((i/15)*consoleFont.pixelHeight) / ((float)512);
		/* alloca la nuova list */
		glNewList(consoleFont.font[i], GL_COMPILE);
		glBegin(GL_QUADS);
		/* angolo alto sx */
		glTexCoord2f(curX, curY);
		glVertex2f(-consoleRasterWidth/2.0f, consoleRasterHeight/2.0f);
		/* angolo alto dx */
		glTexCoord2f(curX, curY + (consoleFont.pixelWidth / ((float)512)));
		glVertex2f(consoleRasterWidth/2.0f, consoleRasterHeight/2.0f);
		/* angolo basso dx */
		glTexCoord2f(curX + (consoleFont.pixelHeight / ((float)512)), curY + (consoleFont.pixelWidth / ((float)512)));
		glVertex2f(consoleRasterWidth/2.0f, -consoleRasterHeight/2.0f);
		/* angolo basso sx */
		glTexCoord2f(curX + (consoleFont.pixelHeight / ((float)512)), curY);
		glVertex2f(-consoleRasterWidth/2.0f, -consoleRasterHeight/2.0f);
		
		//printf("%f,%f - %f,%f - %f,%f - %f,%f\r\n",curX,curY,curX + (consoleFontWidth / 512.0f),curY,curX + (consoleFontWidth / 512.0f),curY + (consoleFontHeight / 512.0f),curX,curY + (consoleFontHeight / 512.0f));
		
		glEnd();
		glEndList();
		
	}
}

GLuint FontManager::getChar(char c, int type)
{
	if (type == CONSOLE_FONT)
	{
		if (c >= 'A' && c <= 'Z')
		{
			return consoleFont.font[c-'A'+32];
		}
		else if (c >= 'a' && c <= 'z')
		{
			return consoleFont.font[c-'a'+64];
		}
		else if (c >= '0' && c <= '9')
		{
			return consoleFont.font[c-'0'+15];
		}
		else if (c == '!')
			return consoleFont.font[0];
		else if (c == '\"')
			return consoleFont.font[1];
		else if (c == '#')
			return consoleFont.font[2];
		else if (c == '$')
			return consoleFont.font[3];
		else if (c == '%')
			return consoleFont.font[4];
		else if (c == '&')
			return consoleFont.font[5];
		else if (c == '\'')
			return consoleFont.font[6];
		else if (c == '(')
			return consoleFont.font[7];
		else if (c == ')')
			return consoleFont.font[8];
		else if (c == '*')
			return consoleFont.font[9];
		else if (c == '+')
			return consoleFont.font[10];
		else if (c == ',')
			return consoleFont.font[11];
		else if (c == '-')
			return consoleFont.font[12];
		else if (c == '.')
			return consoleFont.font[13];
		else if (c == '/')
			return consoleFont.font[14];
		else if (c == ':')
			return consoleFont.font[25];
		else if (c == ';')
			return consoleFont.font[26];
		else if (c == '<')
			return consoleFont.font[27];
		else if (c == '=')
			return consoleFont.font[28];
		else if (c == '>')
			return consoleFont.font[29];
		else if (c == '[')
			return consoleFont.font[58];
		else if (c == '\\')
			return consoleFont.font[59];
		else if (c == ']')
			return consoleFont.font[60];
		else if (c == '^')
			return consoleFont.font[61];
		else if (c == '_')
			return consoleFont.font[62];
		else if (c == '{')
			return consoleFont.font[90];
		else if (c == '|')
			return consoleFont.font[90];
		else if (c == '}')
			return consoleFont.font[90];
		else if (c == '~')
			return consoleFont.font[90];
		/* TODO: da finire */
	}
	
	return consoleFont.font[0];
}

float FontManager::getFontWidth(int type)
{
	if (type == CONSOLE_FONT)
		return consoleFont.width;
	
	return 0.0f;
}

float FontManager::getFontHeight(int type)
{
	if (type == CONSOLE_FONT)
		return consoleFont.height;
	
	return 0.0f;
}
